package v1

import (
	"errors"
	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"
	"go-gin-api/app/controller"
	"go-gin-api/app/model/dto"
	"go-gin-api/app/service"
	"go-gin-api/core/log"
	"go-gin-api/core/middleware"
	re "go-gin-api/core/redis"
	"go-gin-api/exception"
	"go.uber.org/zap"
	"strconv"
)

type UserController struct {
	controller.Base
	Model string
}

// AddUser 添加用户
func (u *UserController) AddUser(c *gin.Context) {
	s := service.User{}
	req := dto.AddUserDTO{}
	err := u.MakeContext(c, u.Model).
		Bind(&req, binding.JSON).
		MakeOrm(c).
		MakeService(&s.Service).Errors
	//现在ip注册10秒一次
	isSuccess, err := re.Redis("default").
		Set(exception.Get(exception.UserIp, c.ClientIP()), c.ClientIP(), "NX", "EX", 10)
	if err != nil {
		log.Ctx(c).Error("读取参数失败", zap.Error(err))
		u.Error()
		return
	}
	if !isSuccess {
		err = errors.New("系统繁忙，请稍候重试")
		u.ErrorMessage(err)
		return
	}
	// 进一步数据验证。例如验证登录名、密码长度。在
	/*_, err = validator.Validate(&req)
	if err != nil {
		log.Ctx(c).Error("验证用户不过关", zap.Error(err))
		u.ErrorMessage(err)
		return
	}*/

	err = s.AddUser(&req)
	if err != nil {
		log.Ctx(c).Error("新增用户失败", zap.Error(err))
		u.ErrorMessage(err)
		return
	}
	u.OK()
}

// Sign 登录
func (u *UserController) Sign(c *gin.Context) {
	s := service.User{}
	req := dto.GetUserDTO{}
	err := u.MakeContext(c, u.Model).
		Bind(&req, binding.JSON).
		MakeOrm(c).
		MakeService(&s.Service).Errors
	//现在ip注册10秒一次
	isSuccess, err := re.Redis("default").
		Set(exception.Get(exception.UserIp, c.ClientIP()), c.ClientIP(), "NX", "EX", 10)
	if err != nil {
		log.Ctx(c).Error("读取参数失败", zap.Error(err))
		u.Error()
		return
	}
	if !isSuccess {
		err = errors.New("系统繁忙，请稍候重试")
		u.ErrorMessage(err)
		return
	}
	// 进一步数据验证。例如验证登录名、密码长度。在
	/*_, err = validator.Validate(&req)
	if err != nil {
		log.Ctx(c).Error("验证用户不过关", zap.Error(err))
		u.ErrorMessage(err)
		return
	}*/

	user, err := s.CheckLogin(&req)
	if err != nil {
		log.Ctx(c).Error("密码错误", zap.Error(err))
		u.ErrorMessage(err)
		return
	}
	token, err := middleware.SetToken(strconv.Itoa(int(user.ID)))
	if err != nil {
		log.Ctx(c).Error("获取token失败", zap.Error(err))
		u.ErrorMessage(err)
		return
	}
	u.OKData(token)
}
